// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_COMPILER_BACKEND_FRAME_ELIDER_H_
#define V8_COMPILER_BACKEND_FRAME_ELIDER_H_

#include "src/compiler/backend/instruction.h"

namespace v8 {
namespace internal {
    namespace compiler {

        // Determine which instruction blocks need a frame and where frames must be
        // constructed/deconstructed.
        class FrameElider {
        public:
            explicit FrameElider(InstructionSequence* code);
            void Run();

        private:
            void MarkBlocks();
            void PropagateMarks();
            void MarkDeConstruction();
            bool PropagateInOrder();
            bool PropagateReversed();
            bool PropagateIntoBlock(InstructionBlock* block);
            const InstructionBlocks& instruction_blocks() const;
            InstructionBlock* InstructionBlockAt(RpoNumber rpo_number) const;
            Instruction* InstructionAt(int index) const;

            InstructionSequence* const code_;
        };

    } // namespace compiler
} // namespace internal
} // namespace v8

#endif // V8_COMPILER_BACKEND_FRAME_ELIDER_H_
